package main

import "fmt"

/*
defer语句被用于预定对一个函数的调用。可以把这类被defer语句调用的函数称为延迟函数。

defer作用：

● 释放占用的资源
● 捕捉处理异常
● 输出日志

结果

如果一个函数中有多个defer语句，它们会以LIFO（后进先出）的顺序执行。
*/
//func main() {
//	defer fmt.Println(1)
//	defer fmt.Println(2)
//	defer fmt.Println(3)
//	defer fmt.Println(4)
//
//	result := DeferAndReturn()
//	fmt.Println(result)
//}

// 测试Defer和Return谁先执行?
/**
当函数执行到 return 语句时，它会首先准备好要返回的值（即 "return"）。
然后，执行所有的 defer 语句。
最后，函数返回已经准备好的值。
所以，具体执行顺序是：

执行 return "return"，即准备好要返回的值。
执行 defer 语句，即打印 "defer"。
返回准备好的值 "return"。
因此，运行这个函数时，你会看到 "defer" 被打印到控制台，然后函数返回 "return"
*/
func DeferAndReturn() string {
	defer fmt.Println("defer")
	return "return"
}
